package com.ld.hpfs.service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 维护下列数据的履历表：
 * 客户主数据
 * 客户联系方式
 * 商品主数据
 * 销方银行账户
 * 
 * @author zssongyunyi
 *
 */
public interface HistoryService {
	
	/**
	 * 添加客户主数据履历
	 * @param params 包含ids，user_id和user_name
	 * @param edit true表示动作为编辑，false表示动作为删除
	 */
	public void addMdataClientHistory(HashMap<String, Object> params, boolean edit);
	
	/**
	 * 添加客户联系方式履历
	 * @param params 包含contact_ids(或ids)，user_id和user_name
	 * @param edit true表示动作为编辑，false表示动作为删除
	 */
	public void addMdataClientContactHistory(HashMap<String, Object> params, boolean edit);
	
	/**
	 * 添加商品主数据履历
	 * @param params 包含id，user_id和user_name
	 * @param edit true表示动作为编辑，false表示动作为删除
	 */
	public void addMdataGoodHistory(HashMap<String, Object> params, boolean edit);
	
	/**
	 * 添加销方银行账户履历
	 * @param params 包含id，user_id和user_name
	 * @param edit true表示动作为编辑，false表示动作为删除
	 */
	public void addMdataBankAccountHistory(HashMap<String, Object> params, boolean edit);
	
	/**
	 * 添加公司设置履历
	 * @param params 包含id，user_id和user_name
	 * @param edit true表示动作为编辑，false表示动作为删除
	 */
	public void addCompanyHistory(HashMap<String, Object> params, boolean edit);
	
	/**
	 * 添加发票设置履历
	 * @param params 包含type，company_id, user_id和user_name
	 * @param edit true表示动作为编辑，false表示动作为删除
	 */
	public void addTicketHistory(HashMap<String, Object> params, boolean edit);
	
	/**
	 * 添加导入设置履历
	 * @param params 包含id, user_id和user_name
	 * @param edit true表示动作为编辑，false表示动作为删除
	 */
	public void addInputDbSourceHistory(HashMap<String, Object> params, boolean edit);
	
	/**
	 * 添加导出设置履历
	 * @param params 包含id, user_id和user_name
	 * @param edit true表示动作为编辑，false表示动作为删除
	 */
	public void addOutputDbSourceHistory(HashMap<String, Object> params, boolean edit);
	
	/**
	 * 添加用户设置履历
	 * @param params 包含id, roles, user_id和user_name
	 * @param edit true表示动作为编辑，false表示动作为冻结/解冻
	 */
	public void addUserHistory(HashMap<String, Object> params, boolean edit);
	
	/**
	 * 添加用户数据权限设置履历
	 * @param params 包含id, companies, user_id和user_name
	 */
	public void addUserPermissionHistory(HashMap<String, Object> params);
	
	/**
	 * 添加票据录入履历
	 * 保存票据时，无论修改与否，都会添加履历
	 * 删除、修改时，更改前数据，默认为没有histId，会添加履历动作表获得histId；更改后数据，默认为有histId
	 * 拆分、合并、规则时，更改前数据，默认为有histId；更改后数据，默认为没有histId，会添加履历动作表获得histId
	 * 同时备份票据主表、票据明细表，根据票据类型备份特殊字段表
	 * @param params 包含headIds(包含所有headId), uid和uname；有可能有histId
	 * @param type 变更动作：0为删除，1为修改，2为拆分，3为合并，4为规则 
	 * @param flag 变更前后：0为变更前，1为变更后
	 * @return 当前履历编号
	 */
	public int addInvoiceHeadHistory(HashMap<String, Object> params, int type, boolean flag);
	
	/**
	 * 拆分（split == true）：
	 * 根据originalIds，返回Map：所给id中实际拆分了的原票据 -> 该原票据拆分出的所有新票据
	 * 合并 （split == false）:
	 * 根据originalIds， 返回Map：所给id生成的新票据 -> 该新票据合并前的所有老票据
	 * @param originalIds 去拆分合并表中检查拆分合并信息的Id
	 * @param split true时，为拆分；false时，为合并
	 * @return 新老票据关系对应
	 */
	public HashMap<Integer, ArrayList<Integer>> getSplitMergeInfo(String[] originalIds, boolean split);
	
	/**
	 * 删除所给票据的所有履历
	 * @param headId 票据内部编号
	 */
	public void deleteInvoiceHistory(HashMap<String,Object> param);
	
	/**
	 * 获得该票据的所有履历动作
	 * 当recursive为true时，包括该票据拆分、合并前老票据的所有履历动作
	 * @param headId 票据履历编号
	 * @param recursive true时，包括该票据拆分、合并前所有履历动作；false时，只包括该票据的履历动作
	 * @return 该票据的所有履历动作
	 */
	public ArrayList<HashMap<String, Object>> getHistoryByHeadid(HashMap<String,Object> param);
	
	/**
	 * 获得所给HIST_ID和变更前后flag的所有票据主表履历
	 * @param histId 票据履历编号
	 * @param flag 变更前后flag， true为变更后，false为变更前
	 * @return 所给HIST_ID和变更前后flag的所有票据主表履历
	 */
	public ArrayList<HashMap<String, Object>> getInvoiceHeadHistoryByHistid(int histId, boolean flag, String language);
	
	/**
	 * 获得所给HIST_ID和变更前后flag的所有票据明细表履历
	 * @param histId 票据履历编号
	 * @param flag 变更前后flag， true为变更后，false为变更前
	 * @return 所给HIST_ID和变更前后flag的所有票据明细表履历
	 */
	public ArrayList<HashMap<String, Object>> getInvoiceDetailHistoryByHistid(int histId, boolean flag);
	
	/**
	 * 删除所给票据的所有履历
	 * @param docNo 票据号
	 */
	public void deleteInvoiceHistoryByDocNo(HashMap<String,Object> params);
	
	/**
	 * 返回所给ID_HEAD_ID的所有拆分、合并后票据的ID_HEAD_ID
	 * @param headIds 系统内部编号
	 * @return 拆分、合并后的系统内部编号
	 */
	public String[] getChildrenByHeadId(String[] headIds);
}

